#pragma once

#include "..\..\..\Common\HkIncludes.h"

using namespace Microsoft::Xna::Framework;

namespace Havok
{
	namespace Dynamics
	{
		public enum struct HkpSimulationType
		{
			Discrete = hkpWorldCinfo::SIMULATION_TYPE_DISCRETE,
			Continuous = hkpWorldCinfo::SIMULATION_TYPE_CONTINUOUS,
			Multithreaded = hkpWorldCinfo::SIMULATION_TYPE_MULTITHREADED,
			Invalid = hkpWorldCinfo::SIMULATION_TYPE_INVALID,
		};

		public enum struct HkpSolverType
		{
			Soft_2Iters = hkpWorldCinfo::SOLVER_TYPE_2ITERS_SOFT,
			Medium_2Iters = hkpWorldCinfo::SOLVER_TYPE_2ITERS_MEDIUM,
			Hard_2Iters = hkpWorldCinfo::SOLVER_TYPE_2ITERS_HARD,

			Soft_4Iters = hkpWorldCinfo::SOLVER_TYPE_4ITERS_SOFT,
			Medium_4Iters = hkpWorldCinfo::SOLVER_TYPE_4ITERS_MEDIUM,
			Hard_4Iters = hkpWorldCinfo::SOLVER_TYPE_4ITERS_HARD,

			Soft_8Iters = hkpWorldCinfo::SOLVER_TYPE_8ITERS_SOFT,
			Medium_8Iters = hkpWorldCinfo::SOLVER_TYPE_2ITERS_MEDIUM,
			Hard_8Iters = hkpWorldCinfo::SOLVER_TYPE_8ITERS_HARD,
		};

		public enum struct HkpStepResult
		{
			StepResultSuccess,
			StepResultMemoryFailureBeforeIntegration,
			StepResultMemoryFailureDuringCollide,
			StepReusltMemoryFailureDuringTOISolve,
		};

		public ref class HkpWorldCinfo
		{
		public:
			HkpWorldCinfo(void);

			property HkpSimulationType SimulationType
			{
			public:
				virtual void set(HkpSimulationType value);
			}

			property HkpSolverType SolverType
			{
			public:
				virtual void set(HkpSolverType value);
			}

			property Vector3 Gravity
			{
			public:
				virtual void set(Vector3 value);
			}

			property float CollisionTolerance
			{
			public:
				virtual void set(float value);
			}

			//HkpWorldInfoNative* m_native;
			hkpWorldCinfo* m_worldCinfo;
		};
	}
}
